A conventional processing system may include hardware resources, such as a central processing unit (CPU) and random access memory (RAM), as well as software resources, such as an operating system (OS) and one or more applications or end-user programs. An application is typically developed to run on a particular OS. The OS typically serves as an intermediary between software applications and the hardware in a processing system. In effect, the OS provides an environment within which the applications can execute.
In addition, it is sometimes possible to partition the hardware resources of a processing system into two or more independent processing environments. The independent environments may be referred to as virtual machines (VMs). Each VM in a processing system may get a different instance of the same OS, or the different VMs may get different types of OSs. An OS running in a VM may be referred to as a guest OS. The VMs may be managed by virtualization products such as a virtual machine monitor (VMM), a hypervisor, or any other suitable component or components (referenced herein generally as a VMM).
A VMM may serve as an intermediary between the OS and the hardware in the processing system. For instance, a processing system may have two VMs and a single network interface controller (NIC), and the OS in each VM may include a device driver for communicating with NICs. The VMM may provide a low level interface (referred to herein as a device model) for input and/or output (I/O) between the NIC and the device drivers in the OS. The device model may allow both VMs to use the same NIC without either OS being aware that the NIC is being shared. When the VMM serves as an intermediary between a VM and a hardware device, the VMM is said to be acting as a proxy for that hardware device.
However, in some circumstances, rather than interposing the VMM between the VM and the hardware device, it may be better to allow the VM to access the device directly.